The need to retrieve snapshots of a table in a database is known in the art. The requested snapshot may be of a previous version of the table. Several conventional approaches exist for retrieving such a snapshot. A first conventional approach periodically backs up the entire database. The entire database is then restored to retrieve the snapshot of each table in the database. A second conventional approach periodically creates static tables. When creating a static table, all the data from a dynamic table is copied into a static table. After the copying finishes, the static table becomes a snapshot of the dynamic table. However, these approaches require burdensome overhead during the creation and deletion of snapshots and thus is not practical for mobile database applications.
A third conventional approach maintains a history table with a single version or timestamp associated with each historical value of each row in a dynamic table. FIG. 1 illustrates this third conventional approach. Version 1 illustrates two entries in table T with keys ‘1’ and ‘2’. The history table HT maintains a single version value associated with each historical value for keys ‘1’ and ‘2’. The ‘isDeleted’ column indicates whether the row was deleted in the indicated version. In version 2, the value of the row with key ‘2’ is changed from ‘20’ to ‘8’. A new row is added to the history table with the version value ‘2’. In version 3, the data value with key ‘1’ is changed from ‘10’ to ‘6’. A new row is added to the history table with version value ‘3’. However, to properly retrieve a snapshot of the table T at version 2, a query with aggregates, joins, and sub-queries is required:SELECT key, data FROM HT wanted WHERE isDeleted=false AND (wanted.version=2 OR wanted.version=(SELECT MAX(lessThanWanted.version) FROM HT lessThanWanted WHERE lessThanWanted.version<=2 AND lessThanWanted.key=wanted.key))
Such a query requires considerable processing resources and is thus an inefficient approach.
Accordingly, there exists a need for a method and system for efficient snapshot querying. The method and system should be able to retrieve a snapshot without requiring a query with aggregates, joins, or sub-queries. It should also significantly reduce overhead requirements. The present invention addresses such a need.